跳到主要内容

连接查询,join

连接,多个表记录之间的连接!

场景:

需要得到一个学生列表,要求是,展示:

学生,性别,班级名字

此时 需要 不单从 学生表获取数据,还需要从 班级表获得数据!

语法:

from 表名1 join 表名2 on 连接条件

过程是,先执行 from子句,需要连接join。

两个特殊的地方:

join ,连接

on ,连接条件

join 连接语法
---------

除了默认的连接之外,有其他形式的连接方式

内连接

外连接,左外连接,右外连接,[全外连接,也是外连接,但是不是mysql所支持的]

交叉连接

自然连接

### 内连接,inner join

记录与真实的记录连接,称之为内连接!(两条真实存在的记录的连接)

mysql默认的连接就是 inner join

内连接,可以连接省略条件!

on可以省略:相当于连接条件永远成立!

返回值是一个 笛卡尔积!

### 外连接,left join,right join

分成:左外连接left join,右外连接right join!

连接的记录,可能是一方不存在的!(两条记录中,可能某条不存在)

总结:内连接,外连接差别不大,只是外连接会将没有连接成功的记录,也出现最终的连接的结果内,而内连接,连接的结果只有连接成功的(两条记录都存在的)

注意好左外与右外的区别:

区别在于,那个表的记录(指的是连接失败的记录),会最终出现在连接结果内?

什么是左表 和 右表?

join关键字前面的(左边的)左表,join关键字后边的(右边的)右表!

左外:如果出现左表记录连接不上右表记录的,左表记录会出现正在最终的连接结果内!而右表记录相应设置成NULL。

右外:如果出现右表记录连接不上左表记录的,右表记录会出现正在最终的连接结果内!而左表记录相应设置成NULL。

因此,可以交换 表的位置,达到使用left与right join 混用的的目的!

问题:

统计 每个班级内,学生的数量!,在班级列表内:

班级名,教室,学生数量

注意,外连接应该有条件!

### 交叉连接,cross join

结果与 内连接一致!

有时,在获得笛卡尔积时,显式的使用 交叉连接!

交叉连接 相当于 是 没有条件的内连接!

### 自然连接,natural join

mysql,自动判断连接条件,帮助我们完成连接!

典型的条件就是,表中的同名字段!

而自然连接也分 内连接与外连接!

自然内连接:natural join

自然左外:natural left join

自然右外:natual right join

总结:

最终的效果只有:内,左外,右外!

交叉,特殊的内!

自然,相当于自动判断连接条件,完成内,左外,右外!

连接条件,on,using
-------------

on,后面使用一个连接条件表达式!

using(连接字段),要求使用同名字段进行连接!

using 的特别地方:

会对字段列表做一次整理!将连接字段作为一次显示!

练习

设计一个系统,保存乒乓球联赛的比赛信息!

队员就是 学生

记录比赛信息:比赛表

做一个比赛信息公告板,要求格式如下:

比赛时间 选手1名字 比赛结果 选手2名字

比赛时间 选手1ID 比赛结果 选手2ID

比赛时间 选手1名字 比赛结果 选手2ID

比赛时间 选手1名字 比赛结果 选手2名字

此时,可以对 学生表 再次连接!

出现 一个表在一次查询时,被多次使用!注意,保证使用时没有歧义!为表起别名!

union查询,联合查询
============

将 多个查询的结果,并列到一个结果集合内!

此时,获得所有男生,按照身高升序排序。

获得所有的女生,按照身高降序排序。

此时 :

此时,将两个结果联合起来:

注意,在union是,如果子句中出现了 order by,则需要子句出现在小括号内!

此时,子句的order by 也会在union的时候,会忽视掉! 需要子句配合limit一起使用order by

union 的连接的两个子句,不要求实同表,只要求,列的数量相同!

union会在联合时:主动去掉相同的记录:此时,可以使用 all关键字 加以修正:

select语句的选项
===========

distinct,取消相同的记录

默认是 all,可以不写,表示所有的记录都出现!

作业
==

1连接查询练习:

做乒乓球比赛 公告页面:

点击进入,选手详细页:

接下来,进入班级信息页

1, 设计,如果当前是篮球比赛呢?

设计,球队,球员,比赛之间的关系!

比赛列表
----

result.php

需要点击时,传递,参数,能够标识当前运动员的参数!

选择传递 ID 比较好!

查询时,应该将两位运动员的ID查询出来!

运动员信息简介
-------

player.php

自然信息:

比赛信息

班级信息
----

class.php

在链接上增加班级id参数:

删除数据,delete,truncate
====================

delete时,支持 order by 和 limit 来限制删除的数据记录!

delete from table\_name;

此时没有where子句,表示所有记录都删除!

如果清空表,此时可以独立使用 truncate 语句,完成清空表

注意与 delete from table的区别:

truncate 是删除表后重建表!

droptable,create table;

delete 是,得到每条记录,逐一删除!

导致的结果,效率上有差别,truncate效率高些!

更新,update
=========

类似于删除,也可以使用 order by 和 limit 确定更新的记录!

![](FDCA1BF2C7E3720BE0F80E6125EFBEF2.png)

上一篇: 22 视图 事务